(deftemplate dama
    (slot nume)
    (slot x)
    (slot y)
    )
(foreach ?n (create$ a b c d)
    (foreach ?i (create$ 1 2 3 4)
        (foreach ?j (create$ 1 2 3 4)
            (assert (dama(nume ?n)(x ?i)(y ?j)))
            )
        )
    )
;(facts)
(defrule rezolvare
    ?f1 <-(dama (nume ?a)(x ?x1)(y ?y1))
    ?f2 <-(dama (nume ?b)(x ?x2)(y ?y2))
    ?f3 <-(dama (nume ?c)(x ?x3)(y ?y3))
    ?f4 <-(dama (nume ?d)(x ?x4)(y ?y4))
    (test (neq ?x1 ?x2))
    (test (neq ?x1 ?x3))
    (test (neq ?x1 ?x4))
    (test (neq ?x2 ?x3))
    (test (neq ?x2 ?x4))
    (test (neq ?x3 ?x4))
    
    (test (neq ?y1 ?y2))
    (test (neq ?y1 ?y3))
    (test (neq ?y1 ?y4))
    (test (neq ?y2 ?y3))
    (test (neq ?y2 ?y4))
    (test (neq ?y3 ?y4))
    
    (test (neq (- ?x1 ?y1) (- ?x2 ?y2)))
    (test (neq (- ?x1 ?y1) (- ?x3 ?y3)))
    (test (neq (- ?x1 ?y1) (- ?x4 ?y4)))
    (test (neq (- ?x2 ?y2) (- ?x3 ?y3) ))
    (test (neq (- ?x2 ?y2) (- ?x4 ?x4)))
    (test (neq (- ?x3 ?y3) (- ?x4 ?x4)))
    
    (test (neq (+ ?x1 ?y1) (+ ?x2 ?y2)))
    (test (neq (+ ?x1 ?y1) (+ ?x3 ?y3)))
    (test (neq (+ ?x1 ?y1) (+ ?x4 ?y4)))
    (test (neq (+ ?x2 ?y2) (+ ?x3 ?y3) ))
    (test (neq (+ ?x2 ?y2) (+ ?x4 ?x4)))
    (test (neq (+ ?x3 ?y3) (+ ?x4 ?x4)))
    
    =>
    
    (printout t "********Solutia********" clrf)
    (printout t "Dama1 se afla pe pozitia " ?x1 ?y1 crlf)
    (printout t "Dama2 se afla pe pozitia "?x2 ?y2 crlf)
    (printout t "Dama3 se afla pe pozitia "?x3 ?y3 crlf)
    (printout t "Dama4 se afla pe pozitia "?x4 ?y4 crlf)
    
    (retract f1)
    (retract f2)
    (retract f3)
    (retract f4)
    
    (run)
    (facts)
    )
